import numpy as np

# 生成模拟数据
np.random.seed(42)
X = 2 * np.random.rand(100, 1)
y = 4 + 3 * X + np.random.randn(100, 1) # 真实关系: y = 4 + 3x + 噪声

# 初始化参数 (对应您图片中的 b1, b2，这里我们用 w 和 b)
w = np.random.randn(1) # 权重，可以理解为b1
b = np.zeros(1)        # 偏置，可以理解为b2

# 设置超参数
learning_rate = 0.1    # 学习率 α
n_iterations = 1000    # 最大迭代次数

# 梯度下降开始
for i in range(n_iterations):
    # 1. 计算预测值
    y_pred = w * X + b

    # 2. 计算损失（MSE），用于监控
    loss = np.mean((y_pred - y)**2)
    if i % 100 == 0:
        print(f"Iteration {i}: Loss = {loss:.4f}")

    # 3. 计算梯度！（这是图片中缺失的关键步骤）
    # 损失函数 J 对 w 的偏导数
    dw = (2 / len(X)) * np.sum((y_pred - y) * X)
    # 损失函数 J 对 b 的偏导数
    db = (2 / len(X)) * np.sum(y_pred - y)

    # 4. 同时更新参数 w 和 b！（对应图片中的更新步骤，但补全了梯度项）
    w = w - learning_rate * dw
    b = b - learning_rate * db

# 输出最终结果
print(f"\n训练完成！")
print(f"真实函数： y = 4 + 3 * x")
print(f"学习到的函数： y = {b[0]:.4f} + {w[0]:.4f} * x")